--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / visualiser-wasm / internal / layout / force_test.go
Displaying Raw • Download
visualiser-wasm/internal/layout/force_test.go dev (9051d6cc) Text, 4.76 KB
T8b949e// SPDX-License-Identifier: 0BSD
Tff7b72package Te6edf3layout_test
Tff7b72import Tb4b4b4(
Ta5d6ff"math"
Ta5d6ff"testing"
Ta5d6ff"github.com/Quad4-Software/MeshChatX/visualiser-wasm/internal/layout"
Tb4b4b4)
Tff7b72func Te6edf3TestSpringLengthTb4b4b4(Te6edf3t Tff7b72*Te6edf3testingTb4b4b4.Te6edf3TTb4b4b4) Tb4b4b4{
Tff7b72if Te6edf3layoutTb4b4b4.Te6edf3SpringLengthTb4b4b4(T79c0ff3Tb4b4b4) Tff7b72!= Te6edf3layoutTb4b4b4.Te6edf3DefaultHubSpringLen Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"hub spring %v"Tb4b4b4, Te6edf3layoutTb4b4b4.Te6edf3SpringLengthTb4b4b4(T79c0ff3Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72if Te6edf3layoutTb4b4b4.Te6edf3SpringLengthTb4b4b4(T79c0ff1Tb4b4b4) Tff7b72!= Te6edf3layoutTb4b4b4.Te6edf3DefaultSpringLen Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"peer spring %v"Tb4b4b4, Te6edf3layoutTb4b4b4.Te6edf3SpringLengthTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72func Te6edf3TestSettleMovesUnfixedNodesTb4b4b4(Te6edf3t Tff7b72*Te6edf3testingTb4b4b4.Te6edf3TTb4b4b4) Tb4b4b4{
Te6edf3res Tff7b72:= Te6edf3layoutTb4b4b4.Te6edf3SettleTb4b4b4(Te6edf3layoutTb4b4b4.Te6edf3RequestTb4b4b4{
Te6edf3NodesTb4b4b4: Tb4b4b4[Tb4b4b4]Te6edf3layoutTb4b4b4.Te6edf3NodeTb4b4b4{
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"me"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3MassTb4b4b4: T79c0ff4Tb4b4b4, Te6edf3FixedTb4b4b4: Tff7b72trueTb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"a"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff10Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3MassTb4b4b4: T79c0ff1Tb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"b"Tb4b4b4, Te6edf3XTb4b4b4: Tff7b72-T79c0ff10Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3MassTb4b4b4: T79c0ff1Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3EdgesTb4b4b4: Tb4b4b4[Tb4b4b4]Te6edf3layoutTb4b4b4.Te6edf3EdgeTb4b4b4{
Tb4b4b4{Te6edf3FromTb4b4b4: Ta5d6ff"me"Tb4b4b4, Te6edf3ToTb4b4b4: Ta5d6ff"a"Tb4b4b4, Te6edf3LengthTb4b4b4: T79c0ff200Tb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3FromTb4b4b4: Ta5d6ff"me"Tb4b4b4, Te6edf3ToTb4b4b4: Ta5d6ff"b"Tb4b4b4, Te6edf3LengthTb4b4b4: T79c0ff200Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3IterationsTb4b4b4: T79c0ff80Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3resTb4b4b4.Te6edf3PositionsTb4b4b4) Tff7b72!= T79c0ff3 Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"expected 3 positions, got %d"Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3resTb4b4b4.Te6edf3PositionsTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72if Te6edf3resTb4b4b4.Te6edf3PositionsTb4b4b4[Ta5d6ff"me"Tb4b4b4]Tb4b4b4.Te6edf3X Tff7b72!= T79c0ff0 Tff7b72|| Te6edf3resTb4b4b4.Te6edf3PositionsTb4b4b4[Ta5d6ff"me"Tb4b4b4]Tb4b4b4.Te6edf3Y Tff7b72!= T79c0ff0 Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"me should stay fixed: %#v"Tb4b4b4, Te6edf3resTb4b4b4.Te6edf3PositionsTb4b4b4[Ta5d6ff"me"Tb4b4b4]Tb4b4b4)
Tb4b4b4}
T8b949e// Springs should push a/b outward from the tiny start distance.
Tff7b72if Te6edf3mathTb4b4b4.Te6edf3AbsTb4b4b4(Te6edf3resTb4b4b4.Te6edf3PositionsTb4b4b4[Ta5d6ff"a"Tb4b4b4]Tb4b4b4.Te6edf3XTb4b4b4) Tff7b72< T79c0ff20 Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"expected a to move outward, got %#v"Tb4b4b4, Te6edf3resTb4b4b4.Te6edf3PositionsTb4b4b4[Ta5d6ff"a"Tb4b4b4]Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72func Te6edf3TestSettleNegativeGravityDisablesOriginPullTb4b4b4(Te6edf3t Tff7b72*Te6edf3testingTb4b4b4.Te6edf3TTb4b4b4) Tb4b4b4{
T8b949e// Far from origin with no edges: default gravity would suck the node home.
Te6edf3res Tff7b72:= Te6edf3layoutTb4b4b4.Te6edf3SettleTb4b4b4(Te6edf3layoutTb4b4b4.Te6edf3RequestTb4b4b4{
Te6edf3NodesTb4b4b4: Tb4b4b4[Tb4b4b4]Te6edf3layoutTb4b4b4.Te6edf3NodeTb4b4b4{
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"lonely"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff800Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff600Tb4b4b4, Te6edf3MassTb4b4b4: T79c0ff1Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3IterationsTb4b4b4: T79c0ff40Tb4b4b4,
Te6edf3GravityTb4b4b4: Tff7b72-T79c0ff1Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Te6edf3p Tff7b72:= Te6edf3resTb4b4b4.Te6edf3PositionsTb4b4b4[Ta5d6ff"lonely"Tb4b4b4]
Tff7b72if Te6edf3mathTb4b4b4.Te6edf3HypotTb4b4b4(Te6edf3pTb4b4b4.Te6edf3XTff7b72-T79c0ff800Tb4b4b4, Te6edf3pTb4b4b4.Te6edf3YTff7b72-T79c0ff600Tb4b4b4) Tff7b72> T79c0ff5 Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"negative gravity must not pull toward origin: start=(800,600) got=%#v"Tb4b4b4, Te6edf3pTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72func Te6edf3TestSettleSeparatesOverlappingPeersTb4b4b4(Te6edf3t Tff7b72*Te6edf3testingTb4b4b4.Te6edf3TTb4b4b4) Tb4b4b4{
Te6edf3res Tff7b72:= Te6edf3layoutTb4b4b4.Te6edf3SettleTb4b4b4(Te6edf3layoutTb4b4b4.Te6edf3RequestTb4b4b4{
Te6edf3NodesTb4b4b4: Tb4b4b4[Tb4b4b4]Te6edf3layoutTb4b4b4.Te6edf3NodeTb4b4b4{
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"hub"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3MassTb4b4b4: T79c0ff2.5Tb4b4b4, Te6edf3FixedTb4b4b4: Tff7b72trueTb4b4b4, Te6edf3RadiusTb4b4b4: T79c0ff24Tb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"a"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff6Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3MassTb4b4b4: T79c0ff1Tb4b4b4, Te6edf3RadiusTb4b4b4: T79c0ff22Tb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"b"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff8Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff2Tb4b4b4, Te6edf3MassTb4b4b4: T79c0ff1Tb4b4b4, Te6edf3RadiusTb4b4b4: T79c0ff22Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3EdgesTb4b4b4: Tb4b4b4[Tb4b4b4]Te6edf3layoutTb4b4b4.Te6edf3EdgeTb4b4b4{
Tb4b4b4{Te6edf3FromTb4b4b4: Ta5d6ff"hub"Tb4b4b4, Te6edf3ToTb4b4b4: Ta5d6ff"a"Tb4b4b4, Te6edf3LengthTb4b4b4: Te6edf3layoutTb4b4b4.Te6edf3DefaultSpringLenTb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3FromTb4b4b4: Ta5d6ff"hub"Tb4b4b4, Te6edf3ToTb4b4b4: Ta5d6ff"b"Tb4b4b4, Te6edf3LengthTb4b4b4: Te6edf3layoutTb4b4b4.Te6edf3DefaultSpringLenTb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3IterationsTb4b4b4: T79c0ff140Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Te6edf3a Tff7b72:= Te6edf3resTb4b4b4.Te6edf3PositionsTb4b4b4[Ta5d6ff"a"Tb4b4b4]
Te6edf3b Tff7b72:= Te6edf3resTb4b4b4.Te6edf3PositionsTb4b4b4[Ta5d6ff"b"Tb4b4b4]
Te6edf3dist Tff7b72:= Te6edf3mathTb4b4b4.Te6edf3HypotTb4b4b4(Te6edf3aTb4b4b4.Te6edf3XTff7b72-Te6edf3bTb4b4b4.Te6edf3XTb4b4b4, Te6edf3aTb4b4b4.Te6edf3YTff7b72-Te6edf3bTb4b4b4.Te6edf3YTb4b4b4)
Tff7b72if Te6edf3dist Tff7b72< T79c0ff80 Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"peers still overlapping: dist=%v a=%#v b=%#v"Tb4b4b4, Te6edf3distTb4b4b4, Te6edf3aTb4b4b4, Te6edf3bTb4b4b4)
Tb4b4b4}
Tff7b72if Te6edf3mathTb4b4b4.Te6edf3HypotTb4b4b4(Te6edf3aTb4b4b4.Te6edf3XTb4b4b4, Te6edf3aTb4b4b4.Te6edf3YTb4b4b4) Tff7b72< T79c0ff80 Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"peer a should leave the hub disc, got %#v"Tb4b4b4, Te6edf3aTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72func Te6edf3TestSettlePreservesAndUpdatesVelocityTb4b4b4(Te6edf3t Tff7b72*Te6edf3testingTb4b4b4.Te6edf3TTb4b4b4) Tb4b4b4{
Te6edf3nodes Tff7b72:= Tb4b4b4[Tb4b4b4]Te6edf3layoutTb4b4b4.Te6edf3NodeTb4b4b4{
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"me"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3MassTb4b4b4: T79c0ff4Tb4b4b4, Te6edf3FixedTb4b4b4: Tff7b72trueTb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"a"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff20Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3VxTb4b4b4: T79c0ff5Tb4b4b4, Te6edf3VyTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3MassTb4b4b4: T79c0ff1Tb4b4b4}Tb4b4b4,
Tb4b4b4}
Te6edf3res Tff7b72:= Te6edf3layoutTb4b4b4.Te6edf3SettleTb4b4b4(Te6edf3layoutTb4b4b4.Te6edf3RequestTb4b4b4{
Te6edf3NodesTb4b4b4: Te6edf3nodesTb4b4b4,
Te6edf3EdgesTb4b4b4: Tb4b4b4[Tb4b4b4]Te6edf3layoutTb4b4b4.Te6edf3EdgeTb4b4b4{Tb4b4b4{Te6edf3FromTb4b4b4: Ta5d6ff"me"Tb4b4b4, Te6edf3ToTb4b4b4: Ta5d6ff"a"Tb4b4b4, Te6edf3LengthTb4b4b4: T79c0ff180Tb4b4b4}Tb4b4b4}Tb4b4b4,
Te6edf3IterationsTb4b4b4: T79c0ff3Tb4b4b4,
Te6edf3DampingTb4b4b4: T79c0ff0.5Tb4b4b4,
Te6edf3MaxSpeedTb4b4b4: T79c0ff20Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3resTb4b4b4.Te6edf3PositionsTb4b4b4) Tff7b72!= T79c0ff2 Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"positions %d"Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3resTb4b4b4.Te6edf3PositionsTb4b4b4)Tb4b4b4)
Tb4b4b4}
T8b949e// Request nodes are updated in place so live Tick can carry momentum.
Tff7b72if Te6edf3nodesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3Vx Tff7b72== T79c0ff5 Tff7b72&& Te6edf3nodesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3X Tff7b72== T79c0ff20 Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"expected velocity/position to integrate, got vx=%v x=%v"Tb4b4b4, Te6edf3nodesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3VxTb4b4b4, Te6edf3nodesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3XTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72func Te6edf3TestSettleStaysCompactTb4b4b4(Te6edf3t Tff7b72*Te6edf3testingTb4b4b4.Te6edf3TTb4b4b4) Tb4b4b4{
Te6edf3res Tff7b72:= Te6edf3layoutTb4b4b4.Te6edf3SettleTb4b4b4(Te6edf3layoutTb4b4b4.Te6edf3RequestTb4b4b4{
Te6edf3NodesTb4b4b4: Tb4b4b4[Tb4b4b4]Te6edf3layoutTb4b4b4.Te6edf3NodeTb4b4b4{
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"me"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3MassTb4b4b4: T79c0ff4Tb4b4b4, Te6edf3FixedTb4b4b4: Tff7b72trueTb4b4b4, Te6edf3RadiusTb4b4b4: T79c0ff32Tb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"iface"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff210Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3MassTb4b4b4: T79c0ff2.5Tb4b4b4, Te6edf3RadiusTb4b4b4: T79c0ff24Tb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"a"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff350Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff20Tb4b4b4, Te6edf3MassTb4b4b4: T79c0ff1Tb4b4b4, Te6edf3RadiusTb4b4b4: T79c0ff22Tb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"b"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff350Tb4b4b4, Te6edf3YTb4b4b4: Tff7b72-T79c0ff20Tb4b4b4, Te6edf3MassTb4b4b4: T79c0ff1Tb4b4b4, Te6edf3RadiusTb4b4b4: T79c0ff22Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3EdgesTb4b4b4: Tb4b4b4[Tb4b4b4]Te6edf3layoutTb4b4b4.Te6edf3EdgeTb4b4b4{
Tb4b4b4{Te6edf3FromTb4b4b4: Ta5d6ff"me"Tb4b4b4, Te6edf3ToTb4b4b4: Ta5d6ff"iface"Tb4b4b4, Te6edf3LengthTb4b4b4: Te6edf3layoutTb4b4b4.Te6edf3DefaultHubSpringLenTb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3FromTb4b4b4: Ta5d6ff"iface"Tb4b4b4, Te6edf3ToTb4b4b4: Ta5d6ff"a"Tb4b4b4, Te6edf3LengthTb4b4b4: Te6edf3layoutTb4b4b4.Te6edf3DefaultSpringLenTb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3FromTb4b4b4: Ta5d6ff"iface"Tb4b4b4, Te6edf3ToTb4b4b4: Ta5d6ff"b"Tb4b4b4, Te6edf3LengthTb4b4b4: Te6edf3layoutTb4b4b4.Te6edf3DefaultSpringLenTb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3IterationsTb4b4b4: T79c0ff140Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Te6edf3iface Tff7b72:= Te6edf3resTb4b4b4.Te6edf3PositionsTb4b4b4[Ta5d6ff"iface"Tb4b4b4]
Te6edf3hubDist Tff7b72:= Te6edf3mathTb4b4b4.Te6edf3HypotTb4b4b4(Te6edf3ifaceTb4b4b4.Te6edf3XTb4b4b4, Te6edf3ifaceTb4b4b4.Te6edf3YTb4b4b4)
Tff7b72if Te6edf3hubDist Tff7b72< T79c0ff80 Tff7b72|| Te6edf3hubDist Tff7b72> T79c0ff360 Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"interface should stay near hub rest length, got dist=%v pos=%#v"Tb4b4b4, Te6edf3hubDistTb4b4b4, Te6edf3ifaceTb4b4b4)
Tb4b4b4}
Tff7b72for Te6edf3_Tb4b4b4, Te6edf3id Tff7b72:= Tff7b72range Tb4b4b4[Tb4b4b4]Tffa657stringTb4b4b4{Ta5d6ff"a"Tb4b4b4, Ta5d6ff"b"Tb4b4b4} Tb4b4b4{
Te6edf3p Tff7b72:= Te6edf3resTb4b4b4.Te6edf3PositionsTb4b4b4[Te6edf3idTb4b4b4]
Te6edf3d Tff7b72:= Te6edf3mathTb4b4b4.Te6edf3HypotTb4b4b4(Te6edf3pTb4b4b4.Te6edf3XTff7b72-Te6edf3ifaceTb4b4b4.Te6edf3XTb4b4b4, Te6edf3pTb4b4b4.Te6edf3YTff7b72-Te6edf3ifaceTb4b4b4.Te6edf3YTb4b4b4)
Tff7b72if Te6edf3d Tff7b72> T79c0ff420 Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"%s exploded away from interface: dist=%v p=%#v iface=%#v"Tb4b4b4, Te6edf3idTb4b4b4, Te6edf3dTb4b4b4, Te6edf3pTb4b4b4, Te6edf3ifaceTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72func Te6edf3BenchmarkSettle500Tb4b4b4(Te6edf3b Tff7b72*Te6edf3testingTb4b4b4.Te6edf3BTb4b4b4) Tb4b4b4{
Te6edf3nodes Tff7b72:= Tffa657makeTb4b4b4(Tb4b4b4[Tb4b4b4]Te6edf3layoutTb4b4b4.Te6edf3NodeTb4b4b4, T79c0ff500Tb4b4b4)
Te6edf3edges Tff7b72:= Tffa657makeTb4b4b4(Tb4b4b4[Tb4b4b4]Te6edf3layoutTb4b4b4.Te6edf3EdgeTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff500Tb4b4b4)
Te6edf3nodesTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Te6edf3layoutTb4b4b4.Te6edf3NodeTb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"me"Tb4b4b4, Te6edf3FixedTb4b4b4: Tff7b72trueTb4b4b4, Te6edf3MassTb4b4b4: T79c0ff4Tb4b4b4}
Tff7b72for Te6edf3i Tff7b72:= T79c0ff1Tb4b4b4; Te6edf3i Tff7b72< T79c0ff500Tb4b4b4; Te6edf3iTff7b72++ Tb4b4b4{
Te6edf3id Tff7b72:= Ta5d6ff"n" Tff7b72+ Te6edf3itoaTb4b4b4(Te6edf3iTb4b4b4)
Te6edf3nodesTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3layoutTb4b4b4.Te6edf3NodeTb4b4b4{Te6edf3IDTb4b4b4: Te6edf3idTb4b4b4, Te6edf3XTb4b4b4: Tffa657float64Tb4b4b4(Te6edf3iTff7b72%T79c0ff50Tb4b4b4) Tff7b72* T79c0ff10Tb4b4b4, Te6edf3YTb4b4b4: Tffa657float64Tb4b4b4(Te6edf3iTff7b72/T79c0ff50Tb4b4b4) Tff7b72* T79c0ff10Tb4b4b4, Te6edf3MassTb4b4b4: T79c0ff1Tb4b4b4}
Te6edf3edges Tff7b72= Tffa657appendTb4b4b4(Te6edf3edgesTb4b4b4, Te6edf3layoutTb4b4b4.Te6edf3EdgeTb4b4b4{Te6edf3FromTb4b4b4: Ta5d6ff"me"Tb4b4b4, Te6edf3ToTb4b4b4: Te6edf3idTb4b4b4, Te6edf3LengthTb4b4b4: T79c0ff200Tb4b4b4}Tb4b4b4)
Tb4b4b4}
Te6edf3req Tff7b72:= Te6edf3layoutTb4b4b4.Te6edf3RequestTb4b4b4{Te6edf3NodesTb4b4b4: Te6edf3nodesTb4b4b4, Te6edf3EdgesTb4b4b4: Te6edf3edgesTb4b4b4, Te6edf3IterationsTb4b4b4: T79c0ff60Tb4b4b4}
Te6edf3bTb4b4b4.Te6edf3ReportAllocsTb4b4b4(Tb4b4b4)
Te6edf3bTb4b4b4.Te6edf3ResetTimerTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3i Tff7b72:= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3bTb4b4b4.Te6edf3NTb4b4b4; Te6edf3iTff7b72++ Tb4b4b4{
Te6edf3_ Tff7b72= Te6edf3layoutTb4b4b4.Te6edf3SettleTb4b4b4(Te6edf3reqTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72func Te6edf3itoaTb4b4b4(Te6edf3n Tffa657intTb4b4b4) Tffa657string Tb4b4b4{
Tff7b72if Te6edf3n Tff7b72== T79c0ff0 Tb4b4b4{
Tff7b72return Ta5d6ff"0"
Tb4b4b4}
Tff7b72var Te6edf3buf Tb4b4b4[T79c0ff16Tb4b4b4]Tffa657byte
Te6edf3i Tff7b72:= Tffa657lenTb4b4b4(Te6edf3bufTb4b4b4)
Tff7b72for Te6edf3n Tff7b72> T79c0ff0 Tb4b4b4{
Te6edf3iTff7b72--
Te6edf3bufTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Tffa657byteTb4b4b4(Ta5d6ff'0' Tff7b72+ Te6edf3nTff7b72%T79c0ff10Tb4b4b4)
Te6edf3n Tff7b72/= T79c0ff10
Tb4b4b4}
Tff7b72return Tffa657stringTb4b4b4(Te6edf3bufTb4b4b4[Te6edf3iTb4b4b4:Tb4b4b4]Tb4b4b4)
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────